﻿/**
 * validator（校验器）文件 by ye 090708
 * 
 * 为什么有这样一个文件？
 * 看了jy.js中的专用校验方法后，发现专用校验方法主要是在通用校验方法的基础上增加了：
 * 1.返回校验信息的消息头，通用校验方法中返回的为“身份证位数不对”，在专用校验方法中增加了
 * 消息头变为“主要关系人身份证位数不对”。
 * 2.是否允许有空值的校验。
 * 
 * 事实上我们只需扩展通用的校验方法，增加上述功能，即可满足大部分需求。
 * 本文件中的校验器（校验方法）的参数列表约定如下：
 * 第一个参数 value（类型string）    ：被校验的值，就是被校验的表单元素的value值。
 * 第二个参数 msgHeader（类型string）：返回校验结果的消息头，即返回的校验结果前面要追加的内容。
 * 第三个参数 notNull（类型boolean） ：为真则不允许为空。如果输入false或不输入此参数，则允许为空。
 * 其余参数 ：如果需要，在第四个参数开始为此方法中独有的参数。
 * 所有方法的返回值必需符合这一约定：如果校验通过则返回一个空串，如果校验不通过则返回校验结果（String类型）。
 * 
 * 下面方法的方法头以"v_"开关，v为validate（校验）的缩写。
 */

//****************
//校验空格 不含空格，包括全角空格和半角空格
//****************
function v_blank(value,msgHeader,notNull){
			
	var header='';
	if(msgHeader)//如果用户有输入消息头
		header=msgHeader;
	if((!value)&&notNull)//如果无输入值，且不允许为空
		return header+"不能为空！\r\n";
	else if(!value)//如果无输入值，且允许为空，则让校验通过
		return '';
	
    var ereg=/\s/g;
    var value2 = value.replace("　"," ");
    if(ereg.test(value2)){
	  return header+"有全角空格或半角空格！\r\n"; 
    }else{
    	 return "";
    }
}

//****************
//校验空 
//****************
function v_null(value,msgHeader){
			
	var header='';
	if(msgHeader)//如果用户有输入消息头
		header=msgHeader;
	
	if(!value)//如果无输入值
		return header+"不能为空！\r\n";
	else if(/^[ 　]+$/.test(value))
		return header+"不能只填空格！\r\n";
	else
		return '';
}

//****************
//校验下拉列表 
//****************
function v_xllb(value,msg){
				
	var m='';
	if(msg)//如果用户有输入消息头
		m=msg;
	
	if(value == 0 || value == "")//如果无输入值
		return "请选择" + m + "！\r\n";
}

//****************
//校验身份证号
//****************
function v_idcard(value,msgHeader,notNull){
	
	var header='';
	if(msgHeader)//如果用户有输入消息头
		header=msgHeader;
	if((!value)&&notNull)//如果无输入值，且不允许为空
		return header+"身份证号码不能为空！\r\n";
	else if(!value)//如果无输入值，且允许为空，则让校验通过
		return '';
	
	var Errors=new Array( 
	"",
	header+"身份证号码位数不对！\r\n",
	header+"身份证号码出生日期超出范围或含有非法字符！\r\n",
	header+"身份证号码校验错误！(如果含X的，必须是大写半角的X！)\r\n",
	header+"身份证地区非法！\r\n"
	);
	var area={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}
	var value,Y,JYM;
	var S,M;
	var value_array = new Array();
	value_array = value.split("");
	//地区检验
	if(area[parseInt(value.substr(0,2))]==null) return Errors[4];
	//身份号码位数及格式检验
	switch(value.length){
	case 15:
		if ((parseInt(value.substr(6,2))+1900) % 4 == 0 || ((parseInt(value.substr(6,2))+1900) % 100 == 0 && (parseInt(value.substr(6,2))+1900) % 4 == 0 )){
			ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性
		} else {
			ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性
		}
		if(ereg.test(value)) return Errors[0];
		else return Errors[2];
		break;
	case 18:
		//18位身份号码检测
		//出生日期的合法性检查
		//闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
		//平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
		if ( parseInt(value.substr(6,4)) % 4 == 0 || (parseInt(value.substr(6,4)) % 100 == 0 && parseInt(value.substr(6,4))%4 == 0 )){
			ereg=/^[1-9][0-9]{5}[0-9]{4}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
		} else {
			ereg=/^[1-9][0-9]{5}[0-9]{4}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式
		}
		if(ereg.test(value)){//测试出生日期的合法性
		//计算校验位
			S = (parseInt(value_array[0]) + parseInt(value_array[10])) * 7
			+ (parseInt(value_array[1]) + parseInt(value_array[11])) * 9
			+ (parseInt(value_array[2]) + parseInt(value_array[12])) * 10
			+ (parseInt(value_array[3]) + parseInt(value_array[13])) * 5
			+ (parseInt(value_array[4]) + parseInt(value_array[14])) * 8
			+ (parseInt(value_array[5]) + parseInt(value_array[15])) * 4
			+ (parseInt(value_array[6]) + parseInt(value_array[16])) * 2
			+ parseInt(value_array[7]) * 1
			+ parseInt(value_array[8]) * 6
			+ parseInt(value_array[9]) * 3 ;
			Y = S % 11;
			M = "F";
			JYM = "10X98765432";
			M = JYM.substr(Y,1);//判断校验位
			if(M == value_array[17]) return Errors[0]; //检测ID的校验位
			else return Errors[3];
		}
		else return Errors[2];
		break;
	default:
		return Errors[1];
	break;
	}
}

//****************
//校验数字 全为半角数字
//****************
function v_digital(value,msgHeader,notNull){
		
	var header='';
	if(msgHeader)//如果用户有输入消息头
		header=msgHeader;
	if((!value)&&notNull)//如果无输入值，且不允许为空
		return header+"不能为空！\r\n";
	else if(!value)//如果无输入值，且允许为空，则让校验通过
		return '';
		
	var regExp = /^\d+$/;
			
	if(!regExp.test(value)){
		return header+"应为半角数字！\r\n";
	}else{
  		return "";
	}
}

//****************
//校验数字 应为整数或浮点数
//****************
function v_float(value,msgHeader,notNull){
			
	var header='';
	if(msgHeader)//如果用户有输入消息头
		header=msgHeader;
	if((!value)&&notNull)//如果无输入值，且不允许为空
		return header+"不能为空！\r\n";
	else if(!value)//如果无输入值，且允许为空，则让校验通过
		return '';
		
	var regExp = /^\d+(\.\d+)?$/;
			
	if(!regExp.test(value)){
		return header+"应为数字！\r\n";
	}else{
  		return "";
	}
}

//****************
//校验数字 全为n位的半角数字
//****************
function v_digitalN(value,msgHeader,notNull,n){
			
	var header='';
	if(msgHeader)//如果用户有输入消息头
		header=msgHeader;
	if((!value)&&notNull)//如果无输入值，且不允许为空
		return header+"不能为空！\r\n";
	else if(!value)//如果无输入值，且允许为空，则让校验通过
		return '';
		
	var regExp = new RegExp("\\d{"+n+"}");
 
	if(!regExp.test(value) || value.length != n){
		return header+"应为"+n+"位半角数字！\r\n";
	}else{
		return "";
	}
}

//****************
//校验空+空格+数字
//****************
function v_blank_digital(value,msgHeader,notNull){
	
	var temp1 = v_blank(value,msgHeader,notNull);
	var temp2 = v_digital(value,msgHeader,notNull);
	
	if(temp1){
		return temp1;
	}else if(temp2){
		return temp2;
	}else{
		return "";
	}
}

//****************
//校验空+空格+n位数字
//****************
function v_blank_digitalN(value,msgHeader,notNull,n){
	
	var temp1 = v_blank(value,msgHeader,notNull);
	var temp2 = v_digitalN(value,msgHeader,notNull,n);
	
	if(temp1){
		return temp1;
	}else if(temp2){
		return temp2;
	}else{
		return "";
	}
}

//****************
//校验字符数在n位与m位之间 计算字符数时不含空格，包括全角空格和半角空格
//参数：n=必须大于的位数；m=必须小于的位数
//****************
function v_zfsNM(value,msgHeader,notNull,n,m){
	
	var header='';
	if(msgHeader)//如果用户有输入消息头
		header=msgHeader;
	if((!value)&&notNull)//如果无输入值，且不允许为空
		return header+"不能为空！\r\n";
	else if(!value)//如果无输入值，且允许为空，则让校验通过
		return '';
		
	var value2 = value.replace("　"," ");
	var rExp = /\s/g;
	var value3 = value2.replace(rExp,"");

	if(value3.length < n ){
		return header+"字数过少！\r\n";
	}else if( value3.length > m){
		return header+"字数过多！\r\n";
	}else {
		return "";
	}
}

//****************
//校验只能含中文字符
//****************
function v_Chinese(value,msgHeader,notNull){ 
	
	var header='';
	if(msgHeader)//如果用户有输入消息头
		header=msgHeader;
	if((!value)&&notNull)//如果无输入值，且不允许为空
		return header+"不能为空！\r\n";
	else if(!value)//如果无输入值，且允许为空，则让校验通过
		return '';
	
	var badChar ="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
	badChar += "abcdefghijklmnopqrstuvwxyz"; 
	badChar += "0123456789"; 
	badChar += " "+"　";//半角与全角空格 
	badChar += "`~!@#$%^&()-_=+]\\|:;\"\\'<,>?/";//不包含*或.的英文符号 

	for(var i=0;i<value.length;i++){
		var c = value.charAt(i);//字符串value中的字符 
		if(badChar.indexOf(c) > -1){ 
		return header+'含有非中文字符!\r\n'; 
		} 
	} 
	return ''; 
} 

//****************
//校验电子邮箱————校验根据：
//域名由各国文字的特定字符集、英文字母、数字及“-”(即连字符或减号)任意组合而成, 
//但开头及结尾均不能含有“-”，“-”不能连续出现 。 域名中字母不分大小写。
//域名最长可达60个字节(包括后缀.com、.net、.org等)。
//****************
function v_email(value,msgHeader,notNull){
		
	var header='';
	if(msgHeader)//如果用户有输入消息头
		header=msgHeader;
	if((!value)&&notNull)//如果无输入值，且不允许为空
		return header+"电子邮箱地址不能为空！\r\n";
	else if(!value)//如果无输入值，且允许为空，则让校验通过
		return '';
		
	//正则表达式最后的i表示，表示不区分大小写
	var regExp = /^[a-z]([a-z0-9]*[-_]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,3}([\.][a-z]{2})?$/i;
			
	if(!regExp.test(value))
		return header+"电子邮箱地址格式不正确！\r\n";
	
  	return "";
}

